#! /bin/bash

# 默认变量设置
CURRENT_PATH=$(pwd)
SERVICE_DIR="${CURRENT_PATH}/jar"
JARNAME="huayi-application.jar"
PORT=8088
LOG_FILE="psi.log"
PID_FILE="${CURRENT_PATH}/psi.pid"

# 函数定义：启动JAR包
start() {
    # 打印启动信息到控制台
    echo "Function 'start' starting..."

    # 定义dump目录路径，基于当前工作目录
    DUMP_DIR="${CURRENT_PATH}/dump"

    # 检查dump目录是否存在
    if [ ! -d "$DUMP_DIR" ]; then
        # 如果dump目录不存在，则打印信息并创建该目录
        echo "Dump directory does not exist, creating $DUMP_DIR ..."
        
        # 创建dump目录及其可能需要的父目录
        mkdir -p "$DUMP_DIR"
        
        # 检查mkdir命令是否成功执行
        if [ $? -eq 0 ]; then
            # 如果成功创建目录，打印成功信息
            echo "Successfully created dump directory."
        else
            # 如果创建目录失败，打印错误信息并退出脚本
            echo "Failed to create dump directory. Exiting..."
            exit 1
        fi
    else
        # 如果dump目录已经存在，打印提示信息
        echo "Dump directory already exists."
    fi

    # 启动Java应用程序，并设置相关JVM参数：
    # -Xms128m 设置初始堆大小为128MB
    # -Xmx512m 设置最大堆大小为512MB
    # -XX:+HeapDumpOnOutOfMemoryError 在发生内存溢出时生成堆转储文件
    # -XX:HeapDumpPath 指定堆转储文件存储路径和名称
    # -Dfile.encoding=utf-8 设置文件编码格式为UTF-8
    # 使用nohup在后台运行，并将输出重定向到日志文件
    nohup java -Xms128m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="${DUMP_DIR}/heapdump.hprof" -Dfile.encoding=utf-8 -jar "${SERVICE_DIR}/${JARNAME}" &
    
    # 将进程ID写入PID文件，以便后续操作（如停止服务）使用
    echo $! > "${PID_FILE}"
    
    # 打印服务启动成功的消息
    echo "== Service start success"
}

# 函数定义：停止Java程序运行
stop() {
    echo "Function 'stop' starting..."
    if [ -f "${PID_FILE}" ]; then
        PID=$(cat "${PID_FILE}")
        if [ -n "$PID" ]; then
            kill "$PID" # 尝试正常终止进程
            if ! kill -0 "$PID" 2>/dev/null; then # 检查进程是否已被终止
                echo "Process with PID $PID has been terminated."
            else
                echo "Failed to terminate process with PID $PID, trying force kill..."
                kill -9 "$PID" # 强制终止进程
            fi
            rm -f "${PID_FILE}" # 删除PID文件
            echo "== Service stop success"
        else
            echo "PID file exists but no PID found, skip stop."
        fi
    else
        echo "PID file not found, skip stop."
    fi
}

# 函数定义：重启JAR包
restart() {
    echo "Function 'restart' starting..."
    stop # 停止服务
    sleep 2 # 等待2秒
    start # 启动服务
    echo "== Service restart success"
}

# 函数定义：默认操作 - 重启JAR包
default_action() {
    echo "Now choose default item: restart"
    restart # 默认操作为重启
}

# 根据传入的参数执行相应的操作
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    *)
        default_action # 默认执行重启操作
        ;;
esac

exit 0